package org.capgemini.tienda.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;
import org.capgemini.tienda.vo.ProductoVO;
import org.capgemini.tienda.vo.UsuarioVO;

public class MySqlUsuariosDAO implements IUsuariosDAO{

	private Connection connection;
	private ResourceBundle queries=ResourceBundle.getBundle("org.capgemini.tienda.dao.MySqlUsuariosDAO");
	protected static Logger log= Logger.getLogger(MySqlUsuariosDAO.class);
	
	public MySqlUsuariosDAO(Connection connection){
		this.connection=connection;
	}

	@Override
	public boolean comprobarUsuario(UsuarioVO usuario) {
		if(usuario!=null){
			ResultSet rs=null;
			PreparedStatement ps=null;
			final String query=queries.getString("comprobarUsuario");
			try{
				if(null == ps){ 
					ps= connection.prepareStatement(query);
					ps.setString(1, usuario.getUser());
					ps.setString(2, usuario.getPassword());
					rs = ps.executeQuery();
					while(rs.next()){
						if(usuario.getUser().equals(rs.getString(1))){
							if(usuario.getPassword().equals(rs.getString(2))){
								return true;
							}
						}
						return false;
					}
				}
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.comprobarUsuario(Usuario usuario): Error al ejecutar: "+query, e);
			} finally {
				try {
					rs.close();
					ps.close();
				} catch (SQLException e) {
					log.error("MySqlUsuariosDAO.comprobarUsuario(Usuario usuario): Error al cerrar la consulta");
				}
			}
		}
		return false;
	}

	@Override
	public String getRole(UsuarioVO usuario){
		if(usuario!=null){
			ResultSet rs=null;
			PreparedStatement ps=null;
			final String query=queries.getString("getRole");
			try{
				if(null == ps){ 
					ps= connection.prepareStatement(query);
					ps.setString(1, usuario.getUser());
					rs = ps.executeQuery();
					while(rs.next()){
						return rs.getString(1);
					}
				}
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.getRole(Usuario usuario): Error al ejecutar: "+query, e);
			} finally {
				try {
					rs.close();
					ps.close();
				} catch (SQLException e) {
					log.error("MySqlUsuariosDAO.getRole(Usuario usuario): Error al cerrar la consulta");
				}
			}
		}
		return null;
	}
	
	@Override
	public String getPassword(UsuarioVO usuario){
		if(usuario!=null){
			ResultSet rs=null;
			PreparedStatement ps=null;
			final String query=queries.getString("getPassword");
			try{
				if(null == ps){ 
					ps= connection.prepareStatement(query);
					ps.setString(1, usuario.getUser());
					rs = ps.executeQuery();
					while(rs.next()){
						return rs.getString(1);
					}
				}
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.getPassword(Usuario usuario): Error al ejecutar: "+query, e);
			} finally {
				try {
					rs.close();
					ps.close();
				} catch (SQLException e) {
					log.error("MySqlUsuariosDAO.getPassword(Usuario usuario): Error al cerrar la consulta");
				}
			}
		}
		return null;
	}

	@Override
	public void addUsuario(UsuarioVO usuario){
		String query =queries.getString("addUsuario");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);
				ps.setString(1, usuario.getFirstName());
				ps.setString(2, usuario.getLastName());
				ps.setString(3, usuario.getUser());
				ps.setString(4, usuario.getEmail());
				ps.executeUpdate();
				
				query =queries.getString("addLogin");
				ps=null;
				ps=connection.prepareStatement(query);
				ps.setString(1, usuario.getUser());
				ps.setString(2, usuario.getPassword());
				ps.executeUpdate();
				
				query =queries.getString("addRoles");
				ps=null;
				ps=connection.prepareStatement(query);
				ps.setString(1, usuario.getUser());
				ps.setString(2, usuario.getRole());
				ps.executeUpdate();
			}
			
		} catch (SQLException e) {
			log.error("MySqlUsuariosDAO.addUsuario(Producto producto): Error al ejecutar: "+query, e);
		}  finally {
			try {
				ps.close();
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.addUsuario(Producto producto): Error al cerrar la consulta");
			}
		}
	}

	@Override
	public boolean existeUsername(String username){
		String query =queries.getString("existeUsername");
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);
				ps.setString(1, username);
				rs = ps.executeQuery();
				while(rs.next()){
					return true;
				}
			}
		} catch (SQLException e) {
			log.error("MySqlUsuariosDAO.existeUsername(String username): Error al ejecutar: "+query, e);
		} finally {
			try {
				rs.close();
				ps.close();
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.existeUsername(String username): Error al cerrar la consulta");
			}
		}
		return false;
	}

	@Override
	public UsuarioVO getDatos(String username) {
		String query =queries.getString("getDatos");
		PreparedStatement ps=null;
		ResultSet rs=null;
		UsuarioVO usuario=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);
				ps.setString(1, username);
				rs = ps.executeQuery();
				while(rs.next()){
					usuario=new UsuarioVO();
					usuario.setId(rs.getString(1));
					usuario.setFirstName(rs.getString(2));
					usuario.setLastName(rs.getString(3));
					usuario.setUser(rs.getString(4));
					usuario.setEmail(rs.getString(5));
					usuario.setRole(getRole(usuario));
					usuario.setPassword(getPassword(usuario));
					
					return usuario;
				}
			}
		} catch (SQLException e) {
			log.error("MySqlUsuariosDAO.getDatos(String username): Error al ejecutar: "+query, e);
		} finally {
			try {
				rs.close();
				ps.close();
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.getDatos(String username): Error al cerrar la consulta");
			}
		}
		return null;
	}

	@Override
	public List<UsuarioVO> getListaUsuarios(){
		ResultSet rs=null;
		PreparedStatement ps=null;
		List<UsuarioVO> usuarios=new ArrayList<UsuarioVO>();
		final String query=queries.getString("listaUsuarios");
		try {
			if(null == ps){ 
				ps= connection.prepareStatement(query);
				rs = ps.executeQuery();
				while(rs.next()){
					UsuarioVO usuario = new UsuarioVO();
					usuario.setId(rs.getString(1));
					usuario.setFirstName(rs.getString(2));
					usuario.setLastName(rs.getString(3));
					usuario.setUser(rs.getString(4));
					usuario.setEmail(rs.getString(5));
					usuario.setRole(getRole(usuario));
					usuarios.add(usuario);
				}
			}

		} catch (SQLException e) {
			log.error("MySqlUsuariosDAO.getListaUsuarios(): Error al ejecutar: "+query, e);
		} finally {
			try {
				rs.close();
				ps.close();
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.getListaUsuarios(): Error al cerrar la consulta", e);
			}
		}
		return usuarios;
	}

	@Override
	public void changeRole(String userName, String role) {
		log.debug("@@@@@LLAMADA A MySqlUsuariosDAO.changeRole()@@@@@");
		final String query =queries.getString("changeRole");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=(PreparedStatement) connection.prepareStatement(query);
				ps.setString(1, role);
				ps.setString(2, userName);
				ps.executeUpdate();
				log.info("Ejecutado: "+query);
				log.info(userName+" - "+role);
			}
		}catch (SQLException e) {
			log.error("Error SQL en MySqlUsuariosDAO.changeRole: "+e.getMessage());
		}
	}
	
	public Connection getConnection(){
		return connection;
	}

	@Override
	public UsuarioVO detalleUsuario(String id) {
		log.debug("@@@@@LLAMADA A MySqlUsuariosDAO.detalleUsuario()@@@@@");
		ResultSet rs=null;
		PreparedStatement ps=null;
		UsuarioVO usuario = null;
		final String query=queries.getString("detalleUsuario");
		try {
			if(null == ps){ 
				ps= (PreparedStatement) connection.prepareStatement(query);
				ps.setString(1, id);
				rs = (ResultSet) ps.executeQuery();
				while(rs.next()){
					usuario = new UsuarioVO();
					usuario.setId(rs.getString("id"));
					usuario.setFirstName(rs.getString("FirstName"));
					usuario.setLastName(rs.getString("LastName"));
					usuario.setUser(rs.getString("UserName"));
					usuario.setEmail(rs.getString("Email"));
					usuario.setRole(getRole(usuario));
					usuario.setPassword(getPassword(usuario));
				}
			}
		} catch (SQLException e) {
			log.error("MySqlUsuariosDAO.detalleUsuario(): Error al ejecutar: "+query, e);
		} finally {
			try {
				rs.close();
				ps.close();
			} catch (SQLException e) {
				log.error("MySqlUsuariosDAO.detalleUsuario(): Error al cerrar la consulta", e);
			}
		}
		return usuario;
	}

	@Override
	public void updateUsuario(UsuarioVO usuario) {
		log.debug("@@@@@LLAMADA A MySqlUsuariosDAO.updateUsuario()@@@@@");
		String query =queries.getString("updateUsuario");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=(PreparedStatement) connection.prepareStatement(query);
				ps.setString(1, usuario.getFirstName());
				ps.setString(2, usuario.getLastName());
				ps.setString(3, usuario.getEmail());
				ps.setString(4, usuario.getUser());
				ps.executeUpdate();
				log.info("Ejecutado: "+query);
				query =queries.getString("updatePassword");
				ps = connection.prepareStatement(query);
				ps.setString(1, usuario.getPassword());
				ps.setString(2, usuario.getUser());
				ps.executeUpdate();
				log.info("Ejecutado: "+query);
				
			}
		}catch (SQLException e) {
			log.error("Error SQL en MySqlUsuariosDAO.updateUsuario: "+e.getMessage());
		}
	}

	@Override
	public void borrarUsuario(String id) {
		log.debug("@@@@@ LLAMADA A MySqlProductosDAO.borrarProducto() @@@@@");
		String query =queries.getString("borrarUsuario");
		try {
			UsuarioVO usuario = detalleUsuario(id);
			log.info("El usuario de id "+id+" y user "+usuario.getUser()+"se va a borrar");
			
			PreparedStatement ps = connection.prepareStatement(query);
			ps.setString(1, id);
			ps.executeUpdate();
			log.info("Ejecutado: "+query);
			
			query =queries.getString("borrarLogin");
			ps = connection.prepareStatement(query);
			ps.setString(1, usuario.getUser());
			ps.executeUpdate();
			log.info("Ejecutado: "+query);
			
			query =queries.getString("borrarRol");
			ps = connection.prepareStatement(query);
			ps.setString(1, usuario.getUser());
			ps.executeUpdate();
			log.info("Ejecutado: "+query);
			ps.close();
			
		} 
		catch (SQLException e) {
			log.error("Error SQL en MySqlProductosDAO.borrarProducto: "+e.getMessage());
		}
	}



}
